package com.lhf.novel.sysuser.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lhf.novel.sysuser.entity.SysPer;
import com.lhf.novel.sysuser.dao.SysPerDao;
import com.lhf.novel.sysuser.service.SysPerService;
import com.lhf.novel.sysuser.vo.SysPerListVo;
import com.lhf.novel.sysuser.vo.SysPerTreeVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.lang.reflect.InvocationTargetException;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * (SysPer)表服务实现类
 *
 * @author 刘会发
 * @since 2020-03-09 11:21:33
 */
@Service("sysPerService")
public class SysPerServiceImpl implements SysPerService {


    @Resource
    private SysPerDao sysPerDao;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public SysPer queryById(Integer id) {
        return this.sysPerDao.queryById(id);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public List<SysPer> queryAllByLimit(int offset, int limit) {
        return this.sysPerDao.queryAllByLimit(offset, limit);
    }

    /**
     * 新增数据
     *
     * @param sysPer 实例对象
     * @return 实例对象
     */
    @Override
    public SysPer insert(SysPer sysPer) {
        this.sysPerDao.insert(sysPer);
        return sysPer;
    }

    /**
     * 修改数据
     *
     * @param sysPer 实例对象
     * @return 实例对象
     */
    @Override
    public SysPer update(SysPer sysPer) throws IllegalAccessException {
        if (StringUtils.isBlank(sysPer.getPerName()) &&
                StringUtils.isBlank(sysPer.getPer()) &&
                StringUtils.isBlank(sysPer.getCompoment()) &&
                StringUtils.isBlank(sysPer.getPerIco()) &&
                StringUtils.isBlank(sysPer.getPath()) &&
                sysPer.getIsDel() == null &&
                sysPer.getType() == null &&
                sysPer.getParentId() == null) {
            throw new IllegalAccessException("至少修改一个字段");
        }
        if (sysPer.getIsDel() == null)//修改
            this.sysPerDao.update(sysPer);
        else {//删除
            List<SysPerTreeVo> treeVos = this.listPerTree(sysPer.getId());
            List<Integer> pids = PidUtil.getPids(treeVos);
            pids.add(sysPer.getId());
            sysPerDao.updateIsDelByIds(pids);
        }
        return this.queryById(sysPer.getId());
    }

    /**
     * 取出所有权限的id集合
     */
    private static class PidUtil {
        private static List<Integer> pids = new LinkedList<>();

        static List<Integer> getPids(List<SysPerTreeVo> treeVos) {
            for (SysPerTreeVo treeVo : treeVos) {
                pids.add(treeVo.getPid());
                getPids(treeVo.getChildren());
            }
            return pids;
        }
    }


    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer id) {
        return this.sysPerDao.deleteById(id) > 0;
    }

    /**
     * 通过实体作为筛选条件查询
     *
     * @return 对象列表
     */
    @Override
    public PageInfo<SysPerListVo> queryAll(String perName, String per, Integer parentId, Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<SysPerListVo> listVos = sysPerDao.queryAll(new SysPer(perName, per, null));
        if (!listVos.isEmpty()) {
            Integer parentId1 = listVos.stream().findFirst().get().getParentId();
            if (parentId1 > 0) {
                parentId = parentId1;
            }
        }
        List<SysPerListVo> parents = sysPerDao.queryAll(new SysPer(perName, per, parentId));
        for (SysPerListVo parent : parents) {
            parent.setChildren(this.queryAll(null, null, parent.getId(), 0, 0).getList());
        }
        return PageInfo.of(parents);
    }

    /**
     * <p>查询权限    树状结构</p>
     *
     * @param parentId
     * @return
     */
    @Override
    public List<SysPerTreeVo> listPerTree(Integer parentId) {
        return sysPerDao.listPerTree(parentId);
    }
}